﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using LogicaNegocio;
using AccesoBD;
using Entidades;

namespace PresentacionEscritorio
{
    public partial class frmAgendaPlanificada : Form
    {
        private Turno turnoSeleccionado=new Turno();
        private DateTime fechaLunes = new DateTime();
        private DateTime fechaViernes = new DateTime();
        private GestorMedicos gM = new GestorMedicos();
        private GestorEspecialidades gE = new GestorEspecialidades();
        private GestorHorariosMedico gHM = new GestorHorariosMedico();
        private long idTurnoSeleccionado;
        private int nroFilaTurnoSeleccionado;
        private int nroColumnaSeleccionado;
        private long nroHCturno;
        public int estadoTurnoSeleccionado { get; set; }
        public Medico oM { get; set; }

        public frmAgendaPlanificada()
        {
            InitializeComponent();
        }
        private long[,] matrizIdTurnos;

        private void frmAgendaPlanificada_Load(object sender, EventArgs e)
        {
            txtNombre.ReadOnly = true;
            txtApellido.ReadOnly = true;
            txtMatricula.ReadOnly = true;
            txtEspecialidades.ReadOnly = true;

            DateTime Hoy = new DateTime();
            Hoy = DateTime.Now.Date;
            establecerDiaLunes(Hoy);
            lblSemana.Text = fechaLunes.Date.ToString("dd/MM/yyyy") + " al " + fechaLunes.Date.AddDays(4).ToString("dd/MM/yyyy");
            fechaViernes = fechaLunes.Date.AddDays(4);
            cargarMedico();
            cargarGrillaSemana();
           
        }
        public void cargarMedico() 
        {
            this.oM = oM;
            txtNombre.Text = oM.Nombre;
            List<EspecialidadMedico>lstEM=gM.ObtenerEspecialidadesVigentesMedico(oM.Legajo);
            if (lstEM!=null)
            {
                foreach (EspecialidadMedico item in lstEM)
                {
                    txtEspecialidades.Text += "/"+item.Especialidad.Nombre;
                }
            }
            txtApellido.Text = oM.Apellido;
            txtMatricula.Text = oM.NroMatricula.ToString();
        }
        public void cargarGrilla() 
        {
         cargarGrillaSemana();
        }
        private void establecerDiaLunes(DateTime Hoy)
        {
            switch (Hoy.DayOfWeek)
            {
                //DOMINGO
                case DayOfWeek.Sunday:
                    fechaLunes=Hoy.AddDays(1);
                    break;
                case DayOfWeek.Monday:
                    fechaLunes = Hoy;
                    break;
                case DayOfWeek.Tuesday:
                    fechaLunes = Hoy.AddDays(-1);
                    break;
                case DayOfWeek.Wednesday:
                    fechaLunes = Hoy.AddDays(-2);
                    break;
                case DayOfWeek.Thursday:
                    fechaLunes = Hoy.AddDays(-3);
                    break;
                case DayOfWeek.Friday:
                    fechaLunes = Hoy.AddDays(-4);
                    break;
                case DayOfWeek.Saturday:
                    fechaLunes = Hoy.AddDays(-5);
                    break;
                default:
                    break;


            }

        }

        //falta hacer
        private void cargarGrillaSemana()
        {
            TimeSpan horaInicio;
            bool esMañana;

            //limpiamos grilla
            if (grdAgenda.RowCount > 0)
                grdAgenda.Rows.Clear();
            if (grdAgenda.ColumnCount > 0)
                grdAgenda.Columns.Clear();

            //agregamos las columnas que necesitamos
            DataGridViewTextBoxColumn hora = new DataGridViewTextBoxColumn();
            hora.Name = "Hora";
            hora.HeaderText = "Hora/Dia";
            grdAgenda.Columns.Add(hora);

            //habria que buscar los consultorios y agregarlos, pero bue
            grdAgenda.Columns.Add("Lunes", "Lunes");
            grdAgenda.Columns.Add("Martes", "Martes");
            grdAgenda.Columns.Add("Miercoles", "Miércoles");
            grdAgenda.Columns.Add("Jueves", "Jueves");
            grdAgenda.Columns.Add("Viernes", "Viernes");

            //vemos segun la hora que turno es, y le cargamos la hora de incio y fin
            TimeSpan horaInicioMañana = new TimeSpan(08, 00, 00);
            TimeSpan horaFinMañana = new TimeSpan(13, 00, 00);
            TimeSpan horaInicioTarde = new TimeSpan(14, 00, 00);
            TimeSpan horaFinTarde = new TimeSpan(20, 00, 00);

            //turno tarde

            horaInicio = horaInicioMañana;
            TimeSpan duracionTurno = new TimeSpan(0, 30, 0);
            int index = 0;
            while (horaInicio <= horaFinTarde)
            {

                if (index == 0)
                {
                    grdAgenda.Rows.Add();
                    grdAgenda.Rows[index].Cells[0].Value = horaInicioMañana.ToString();
                    index = index + 1;
                }
                else
                {
                    horaInicio = horaInicio + duracionTurno;
                    if (horaInicio <= horaFinTarde)
                    {
                        if (horaInicio <= horaFinMañana || horaInicio >= horaInicioTarde)
                        {
                            grdAgenda.Rows.Add();

                            grdAgenda.Rows[index].Cells[0].Value = horaInicio.ToString();
                            index++;

                        }


                    }


                }
               
                //---

            }
            //OBTENGO LOS HORARIOS POR MEDICO POR ESPECIALIDAD.
            //Primero obtenego todas las especialidades del medico
            //--NOmodificado/*/ 
            List<EspecialidadMedico> lstEspecialidadesMedico = gM.ObtenerEspecialidadesVigentesMedico(6);
            List<HorarioAtencion> lstHorarioMedico = new List<HorarioAtencion>();
            List<HorarioAtencion> itemsHorarioAtencion = new List<HorarioAtencion>();
            if (lstEspecialidadesMedico != null)
            {
                foreach (EspecialidadMedico item in lstEspecialidadesMedico)
                {
                    lstHorarioMedico = gHM.obtenerHorariosAtencionMedicoEnEspecialidad(item.CodEspecialidad, 6);
                    foreach (HorarioAtencion itemHor in lstHorarioMedico)
                    {
                        itemsHorarioAtencion.Add(itemHor);
                    }
                }
            }

            int cantFilas = grdAgenda.RowCount;
            grdAgenda.RowsDefaultCellStyle.BackColor = Color.LightGray;  //por defecto todo es No disponible

            for (int i = 0; i < cantFilas; i++) //cargamos las celdas Disponibles y seteamos que la primera columna, la de las horas, no sea editable y tenga otro color
            {
                grdAgenda.Rows[i].Cells[0].Style.BackColor = Color.DimGray; //celdas de hora
                grdAgenda.Rows[i].Cells[0].Style.ForeColor = Color.White;
                grdAgenda.Rows[i].Cells[0].ReadOnly = true;


            }

            //MATRIZ DONDE SE ALMACENARAN LOS ID TURNO
            matrizIdTurnos = new long[grdAgenda.RowCount, grdAgenda.ColumnCount];
            //------
            
            //LLENAMOS LAS MATRICES CON LOS HORARIOS DEL MEDICO

            foreach (HorarioAtencion oHA in itemsHorarioAtencion)
            {
                //mañana
                if (horaInicioMañana>=oHA.HoraDesde||horaFinMañana>=oHA.HoraHasta)
                {
                    
                }
                //tarde
                if (horaInicioTarde>=oHA.HoraDesde||horaFinTarde>=oHA.HoraHasta)
                {
                    for (int i = 0; i < grdAgenda.Rows.Count; i++)
                    {
                        TimeSpan horaCelda = TimeSpan.Parse(grdAgenda.Rows[i].Cells[0].Value.ToString());
                        if (horaCelda.Hours==16)
                        {
                            int f = 0;
                        }
                        if (horaCelda>=oHA.HoraDesde)
                        {
                            if (horaCelda<=oHA.HoraHasta)
                            {
                                grdAgenda.Rows[i].Cells[oHA.Dia.Nombre].Style.BackColor = Color.White;
                            }
                            
                        }
                    }
                }
            }
            
            
            
            //HORAS AUXILIARES A USAR PARA TRAER TURNOS
            TimeSpan horaDesde = new TimeSpan(13, 00, 00);
            TimeSpan horaHasta = new TimeSpan(23, 00, 00);


            //------
            //List<Turno> lsTurnosSemana = GestorAgendaTurnos.obtenerTurnoPorSemanaPorMedico(oM.Legajo, fechaLunes, fechaViernes, horaDesde, horaHasta);
          List<Turno> lsTurnosSemana = GestorAgendaTurnos.obtenerTurnoPorSemanaPorMedico(oM.Legajo, fechaLunes, fechaViernes, horaDesde, horaHasta);



          foreach (Turno item in lsTurnosSemana)
          {
              if (item.HoraTurno >= horaInicioTarde && item.HoraTurno <= horaFinTarde)
              {
                  for (int i = 0; i < grdAgenda.Rows.Count; i++)
                  {
                      TimeSpan horaCelda = TimeSpan.Parse(grdAgenda.Rows[i].Cells[0].Value.ToString());
                      DayOfWeek nroDia = item.FechaTurno.DayOfWeek;
                      string nombColumna = ObtenerNombreColumna(nroDia);
                     
                      if (item.HoraTurno == horaCelda)
                      {
                         int numCol= obtenerNumeroColumna(nroDia);
                          
                          //validamos el estado del turno
                          switch (item.MiEstadoTurno.IdEstadoTurno)
                          {
                                  
                              case 1: //disponible
                                  grdAgenda.Rows[i].Cells[nombColumna].Style.BackColor = Color.White;
                                  grdAgenda.Rows[i].Cells[nombColumna].Value = item.HoraTurno;
                                  break;
                              case 2: //asignado
                                  grdAgenda.Rows[i].Cells[nombColumna].Style.BackColor = Color.Orange;
                                  matrizIdTurnos[i, numCol] = item.IdTurno;
                                  grdAgenda.Rows[i].Cells[nombColumna].Value = item.HoraTurno; //agregar nombre paciente
                                  break;
                              case 3: //asistido no cobrado
                                  grdAgenda.Rows[i].Cells[nombColumna].Style.BackColor = Color.Chocolate;
                                  grdAgenda.Rows[i].Cells[nombColumna].Value = item.HoraTurno; //agregar nombre paciente

                                  matrizIdTurnos[i, numCol] = item.IdTurno;
                                  break;
                              case 4: //asistido cobrado
                                  grdAgenda.Rows[i].Cells[nombColumna].Style.BackColor = Color.LightCoral;
                                  grdAgenda.Rows[i].Cells[nombColumna].Value = item.HoraTurno; //agregar nombre paciente
                                  matrizIdTurnos[i, numCol] = item.IdTurno;
                                  break;
                              case 5: //atendido no cobrado
                                  grdAgenda.Rows[i].Cells[nombColumna].Style.BackColor = Color.YellowGreen;
                                  grdAgenda.Rows[i].Cells[nombColumna].Value = item.HoraTurno; //agregar nombre paciente
                                  matrizIdTurnos[i, numCol] = item.IdTurno;
                                  break;
                              case 6: //atendido cobrado
                                  grdAgenda.Rows[i].Cells[nombColumna].Style.BackColor = Color.SeaGreen;
                                  grdAgenda.Rows[i].Cells[nombColumna].Value = item.HoraTurno; //agregar nombre paciente
                                  matrizIdTurnos[i, numCol] = item.IdTurno;
                                  break;
                              case 7: //no asistido
                                  grdAgenda.Rows[i].Cells[nombColumna].Style.BackColor = Color.DarkGray;
                                  grdAgenda.Rows[i].Cells[nombColumna].Value = item.HoraTurno; //agregar nombre paciente
                                  matrizIdTurnos[i, numCol] = item.IdTurno;
                                  break;

                          } //fin switch
                      }//FIN IF HORA TURNO
                  }

                  //cargo a la grilla




              }//FIN FOR TURNO
          }

        }

        //grdAgenda.Rows[1].Cells[2].Style.BackColor = Color.Orange;  //turno Asignado
        //grdAgenda.Rows[2].Cells[2].Style.BackColor = Color.Orange;
        //grdAgenda.Rows[4].Cells[4].Style.BackColor = Color.Orange;
        //grdAgenda.Rows[5].Cells[2].Style.BackColor = Color.Chocolate; //turno Asignado con llegada registrada
        //grdAgenda.Rows[1].Cells[4].Style.BackColor = Color.LightCoral; //turno Cancelado
        //grdAgenda.Rows[5].Cells[4].Style.BackColor = Color.YellowGreen;
        private string ObtenerNombreColumna(DayOfWeek dia)
        {
            string nombreColumna = "";
            switch (dia)
            {
                case DayOfWeek.Friday:
                    nombreColumna = "Viernes";
                    break;
                case DayOfWeek.Monday:
                    nombreColumna = "Lunes";
                    break;
                case DayOfWeek.Saturday:
                    nombreColumna = "Sabado";
                    break;
                case DayOfWeek.Sunday:
                    nombreColumna = "Domingo";
                    break;
                case DayOfWeek.Thursday:
                    nombreColumna = "Jueves";
                    break;
                case DayOfWeek.Tuesday:
                    nombreColumna = "Martes";
                    break;
                case DayOfWeek.Wednesday:
                    nombreColumna = "Miercoles";
                    break;
            }
            return nombreColumna;
        }
        private int obtenerNumeroColumna(DayOfWeek dia)
        {
            int numColum=0;
            switch (dia)
            {
                case DayOfWeek.Friday:
                  
                    numColum = 6;
                    break;
                case DayOfWeek.Monday:
                   
                    numColum = 2;
                    break;
                case DayOfWeek.Saturday:
                    
                    break;
                case DayOfWeek.Sunday:
                    
                    break;
                case DayOfWeek.Thursday:
            
                    numColum = 5;
                    break;
                case DayOfWeek.Tuesday:
                  
                    numColum = 3;
                    break;
                case DayOfWeek.Wednesday:
                
                    numColum = 4;
                    break;
            }
            return numColum;
        }
        private void btnSiguiente_Click(object sender, EventArgs e)
        {
            fechaLunes = fechaLunes.Date.AddDays(+7);
            fechaViernes = fechaLunes.Date.AddDays(4);
            lblSemana.Text = fechaLunes.Date.ToString("dd/MM/yyyy") + " al " + fechaLunes.Date.AddDays(4).ToString("dd/MM/yyyy");
            cargarGrillaSemana();
        }

        private void btnAtras_Click(object sender, EventArgs e)
        {
            fechaLunes = fechaLunes.Date.AddDays(-7);
            fechaViernes = fechaLunes.Date.AddDays(4);
            lblSemana.Text = fechaLunes.Date.ToString("dd/MM/yyyy") + " al " + fechaLunes.Date.AddDays(4).ToString("dd/MM/yyyy");
            cargarGrillaSemana();
        }


        private void contextMenuStrip1_Opening(object sender, CancelEventArgs e)
        {

        }

        private void verPacienteToolStripMenuItem_Click(object sender, EventArgs e)
        {
            long idBusqueda = nroHCturno;
            frmMostrarDatosPaciente frm = new frmMostrarDatosPaciente(idBusqueda);
            frm.Show();
        }

        private void btnAceptar_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void btnCancelar_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void grdAgenda_CellMouseClick(object sender, DataGridViewCellMouseEventArgs e)
        {
            int fila = grdAgenda.CurrentCell.RowIndex;
            int column = grdAgenda.CurrentCell.ColumnIndex+1;

            if (grdAgenda.Rows[e.RowIndex].Cells[e.ColumnIndex].Style.BackColor == Color.Orange)  //turno asignado
            {
                estadoTurnoSeleccionado = 2;

                //tomamos el id del turno

                idTurnoSeleccionado = matrizIdTurnos[fila, column];
                //OBTENEMOS EL TURNO que selecciono
                turnoSeleccionado = GestorAgendaTurnos.obtenerPacienteTurno(idTurnoSeleccionado);

                //tomamos el nroHC del paciente que tiene el turno
                nroHCturno = GestorAgendaTurnos.obtenerPacienteTurno(idTurnoSeleccionado).NroHCPaciente;

                //guardamos la celda a la que pertenece dicho turno
                nroFilaTurnoSeleccionado = e.RowIndex;
                nroColumnaSeleccionado = e.ColumnIndex;


                contextMenuStrip1.Items["verPacienteToolStripMenuItem"].Visible = true;
                Point p = PointToClient(MousePosition);
                contextMenuStrip1.Show(this, p);

            }
            if (grdAgenda.Rows[e.RowIndex].Cells[e.ColumnIndex].Style.BackColor == Color.YellowGreen)
            {
                estadoTurnoSeleccionado = 5;

                //tomamos el id del turno
                idTurnoSeleccionado = matrizIdTurnos[fila, column];
                //OBTENEMOS EL TURNO que selecciono
                turnoSeleccionado = GestorAgendaTurnos.obtenerPacienteTurno(idTurnoSeleccionado);

                //tomamos el nroHC del paciente que tiene el turno
                nroHCturno = GestorAgendaTurnos.obtenerPacienteTurno(idTurnoSeleccionado).NroHCPaciente;

                //guardamos la celda a la que pertenece dicho turno
                nroFilaTurnoSeleccionado = e.RowIndex;
                nroColumnaSeleccionado = e.ColumnIndex;


                contextMenuStrip1.Items["verPacienteToolStripMenuItem"].Visible = true;
                Point p = PointToClient(MousePosition);
                contextMenuStrip1.Show(this, p);

            }
            else if (grdAgenda.Rows[e.RowIndex].Cells[e.ColumnIndex].Style.BackColor == Color.Chocolate) //turno asistido sin cobrar
            {
                //MessageBox.Show("Turno registrado con llegada a " + nombrePaciente, "Aviso", MessageBoxButtons.OKCancel);
                estadoTurnoSeleccionado = 3;

                //tomamos el id del turno
                idTurnoSeleccionado = matrizIdTurnos[fila, column];

                //tomamos el nroHC del paciente que tiene el turno
                nroHCturno = GestorAgendaTurnos.obtenerPacienteTurno(idTurnoSeleccionado).NroHCPaciente;

                //guardamos la celda a la que pertenece dicho turno
                nroFilaTurnoSeleccionado = e.RowIndex;
                nroColumnaSeleccionado = e.ColumnIndex;


                contextMenuStrip1.Items["verPacienteToolStripMenuItem"].Visible = true;
                Point p = PointToClient(MousePosition);
                contextMenuStrip1.Show(this, p);
            }
            else if (grdAgenda.Rows[e.RowIndex].Cells[e.ColumnIndex].Style.BackColor == Color.LightCoral) //Asistido y cobrado
            {
                estadoTurnoSeleccionado = 6;

                //tomamos el id del turno
                idTurnoSeleccionado = matrizIdTurnos[fila, column];

                //tomamos el nroHC del paciente que tiene el turno
                nroHCturno = GestorAgendaTurnos.obtenerPacienteTurno(idTurnoSeleccionado).NroHCPaciente;

                //guardamos la celda a la que pertenece dicho turno
                nroFilaTurnoSeleccionado = e.RowIndex;
                nroColumnaSeleccionado = e.ColumnIndex;

                contextMenuStrip1.Items["verPacienteToolStripMenuItem"].Visible = true;
                Point p = PointToClient(MousePosition);
                contextMenuStrip1.Show(this, p);
            }
            else if (grdAgenda.Rows[e.RowIndex].Cells[e.ColumnIndex].Style.BackColor == Color.SeaGreen) //Atendido y cobrado
            {
                estadoTurnoSeleccionado = 6;

                //tomamos el id del turno
                idTurnoSeleccionado = matrizIdTurnos[fila, column];

                //tomamos el nroHC del paciente que tiene el turno
                nroHCturno = GestorAgendaTurnos.obtenerPacienteTurno(idTurnoSeleccionado).NroHCPaciente;

                //guardamos la celda a la que pertenece dicho turno
                nroFilaTurnoSeleccionado = e.RowIndex;
                nroColumnaSeleccionado = e.ColumnIndex;

                contextMenuStrip1.Items["verPacienteToolStripMenuItem"].Visible = true;
                Point p = PointToClient(MousePosition);
                contextMenuStrip1.Show(this, p);
            }
        }

        private void panelDatosMedico_Paint(object sender, PaintEventArgs e)
        {

        }
    }
}
